聊聊 maven 的 snapshot 和 metadata

Maven jar / pom download 分析。

碰上这个问题背景是:maven 中,snapshot 包是允许发布时覆盖的。那么有个问题就是,当:

  • 依赖了 snapshot 版本的 jar
  • 在环境执行某些操作,需要使用前面的 jar

这种情况下,maven 是如何判断是否更新本地 repository 中的 jar 呢?

基本流程

按照 jar 的 version 类型不同,可以分为:

  • SNAPSHOT
  • RELEASE

RELEASE 很简单,看 local 有就不会尝试去获取 remote。而 SNAPSHOT 设计初衷就是为了在不改变版本号的前提下做快速迭代,所以它支持按照时间比对的方式来更新 jar,遵循如下逻辑:

  1. check -o option 是否配置
    • -o 是 offline 的意思,一旦使用则只访问本地 repo
  2. check repository 配置中的 updatePolicy 的值
    • This element specifies how often updates should attempt to occur.
    • 支持的值有: always, daily (default), interval:X (where X is an integer in minutes) or never
  3. 当 updatePolicy 策略判断通过,尝试获取 remote metadata.xml
  4. 比较 local & remote metadata.xml 中时间戳,决定是否执行 download

关于 metadata

关于 metadata 详情可以参考:maven metadata model

lastUpdate

当 download 失败的时候,在 local 会出现这样的文件,具体可以参考:maven-downloads-have-lastupdated-as-extension。重点是:

  • 设计之初是为了减少网络带宽消耗
  • 更新的 interval 是 code 中的
  • 可以通过 -U 来强制每次都去更新

参考资料